﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Collections;
using WF_QLThuVien.Entities;
using WF_QLThuVien.Utilities;
using WF_QLThuVien.DataLayer;
using System.Data;
using WF_QLThuVien.Entities.PhieuMuon;
using WF_QLThuVien.Entities.Sach;

namespace WF_QLThuVien.DataLayer
{
    public class CDocGiaDAL : CConnection
    {

        #region: Wolfag
        DataAccessHelper db = new DataAccessHelper();
        #endregion

        //DataAccessHelper db = new DataAccessHelper();
        OleDbCommand cmd=new OleDbCommand();
        public void KTConnect()
        {
            //kiem tra lai ket noi
            try { Connection(); }
            catch (Exception ex) { throw ex; }
        }

        public ArrayList loadDocGia()
        {
            KTConnect();
            try
            {
                ArrayList arrDocGia = new ArrayList();
                cmd = new OleDbCommand("SELECT * FROM DocGia", dataConnection);
                OleDbDataReader dataReader = cmd.ExecuteReader();
                if (dataReader == null)
                {
                    throw new Exception("Không có dữ liệu đọc giả - CDocGiaDAL");
                }
                else
                {
                    while (dataReader.Read())
                    {
                        CDocGia dg = new CDocGia();
                        dg.DocGiaID = dataReader.GetValue(0).ToString();
                        dg.TenDocGia = dataReader.GetValue(1).ToString();
                        dg.MaSoSV = dataReader.GetValue(2).ToString();
                        dg.NgaySinh = Convert.ToDateTime(dataReader.GetValue(3));
                        dg.GioiTinh = Convert.ToBoolean(dataReader.GetValue(4));
                        dg.SoDT = dataReader.GetValue(5).ToString();
                        dg.NgayLapThe = Convert.ToDateTime(dataReader.GetValue(6));
                        dg.TinhTrang = dataReader.GetValue(7).ToString();
                        dg.KyQuy = Convert.ToDouble(dataReader.GetValue(8));
                        dg.NienKhoa = dataReader.GetValue(9).ToString();
                        dg.Lop = dataReader.GetValue(10).ToString();
                        dg.Khoa = dataReader.GetValue(11).ToString();
                        dg.DsPhieuMuon = LoadPhieuMuon(dataReader.GetValue(0).ToString());
                        arrDocGia.Add(dg);
                    }
                    return arrDocGia;
                }
            }
            catch (System.Exception ex)
            {
                throw new Exception("LỖi Load DocGia - CDocGiaDAL");
            }
        }

        #region: Load Danh Sách Phiếu Mượn và những thành phần liên quan. PANDA
        private List<CPhieuMuon> LoadPhieuMuon(string maDocGia)
        {
            KTConnect();
            try
            {
                List<CPhieuMuon> arrPM = new List<CPhieuMuon>();
                CPhieuMuon pm = new CPhieuMuon();
                cmd = new OleDbCommand("SELECT * FROM PhieuMuon WHERE DocGiaID='" + maDocGia + "'", dataConnection);
                OleDbDataReader reader = cmd.ExecuteReader();
                if (reader == null)
                {
                    throw new Exception("Không Tìm Thấy Phiếu Mượn Từ Mã Đọc Giả - CDocGiaDAL");
                }
                else
                {
                    while (reader.Read())
                    {
                        pm = new CPhieuMuon();
                        pm.PhieuMuonID = reader.GetValue(0).ToString();
                        pm.DocGiaID = reader.GetValue(1).ToString();
                        pm.NgayLap = Convert.ToDateTime(reader.GetValue(2));
                        List<CCTPhieuMuon> arrCTPM = new List<CCTPhieuMuon>();
                        cmd = new OleDbCommand("SELECT * FROM ChiTietPhieuMuon WHERE PhieuMuonID='" + pm.PhieuMuonID + "'", dataConnection);
                        OleDbDataReader readerCTPM = cmd.ExecuteReader();
                        while (readerCTPM.Read()) //Lấy ra ctpm + sách bên trong PM
                        {
                            CCTPhieuMuon ctpm = new CCTPhieuMuon();
                            CSach s = new CSach();
                            ctpm.PhieuMuonID = readerCTPM.GetValue(0).ToString();
                            #region: Tìm Sách
                            cmd = new OleDbCommand("SELECT * FROM Sach WHERE SachID='" + readerCTPM.GetValue(1).ToString() + "'", dataConnection);
                            OleDbDataReader readerSach = cmd.ExecuteReader();
                            while (readerSach.Read())
                            {
                                s = new CSach();
                                s.SachID = readerSach.GetValue(0).ToString();
                                s.DauSachID = readerSach.GetValue(1).ToString();
                                s.TrangThai = readerSach.GetValue(2).ToString();
                                s.GhiChu = readerSach.GetValue(3).ToString();
                            }
                            #endregion
                            ctpm.Sach = s;
                            ctpm.TrangThai = readerCTPM.GetValue(2).ToString();
                            ctpm.NgayTra = Convert.ToDateTime(readerCTPM.GetValue(3));
                            ctpm.SoLanGiaHan = Convert.ToInt32(readerCTPM.GetValue(4));
                            arrCTPM.Add(ctpm);
                        }
                        pm.CtPhieuMuon = arrCTPM;
                        arrPM.Add(pm);
                    }
                    return arrPM;
                }
            }
            catch (System.Exception ex)
            {
                throw new Exception("Load Phiếu Mượn Không Thành Công - CDocGiaDAL" + ex.ToString());
            }
        }
        #endregion

        public ArrayList loadOnlyMaDocGia(string maDocGia)
        {
            KTConnect();
            try
            {
                ArrayList arrDG = new ArrayList();
                CDocGia dg = new CDocGia();
                cmd = new OleDbCommand("SELECT * FROM DocGia WHERE DocGiaID='" + maDocGia + "'", dataConnection);
                OleDbDataReader dataReader = cmd.ExecuteReader();
                if (dataReader == null)
                {
                    throw new Exception("Không có dữ liệu đọc giả - CDocGiaDAL");
                }
                else
                {
                    while (dataReader.Read())
                    {

                        dg.DocGiaID = maDocGia;
                        dg.TenDocGia = dataReader.GetValue(1).ToString();
                        dg.MaSoSV = dataReader.GetValue(2).ToString();
                        dg.NgaySinh = Convert.ToDateTime(dataReader.GetValue(3));
                        dg.GioiTinh = Convert.ToBoolean(dataReader.GetValue(4));
                        dg.SoDT = dataReader.GetValue(5).ToString();
                        dg.NgayLapThe = Convert.ToDateTime(dataReader.GetValue(6));
                        dg.TinhTrang = dataReader.GetValue(7).ToString();
                        dg.KyQuy = Convert.ToDouble(dataReader.GetValue(8));
                        dg.NienKhoa = dataReader.GetValue(9).ToString();
                        dg.Lop = dataReader.GetValue(10).ToString();
                        dg.Khoa = dataReader.GetValue(11).ToString();
                        dg.DsPhieuMuon = LoadPhieuMuon(dataReader.GetValue(0).ToString());
                        arrDG.Add(dg);
                    }
                    return arrDG;
                }
            }
            catch (System.Exception ex)
            {
                throw new Exception("LỖi Load DocGia - CDocGiaDAL");
            }
        }

        public ArrayList loadOnlyMaSinhVien(string maSinhVien)
        {
            KTConnect();
            try
            {
                ArrayList arrDG = new ArrayList();
                CDocGia dg = new CDocGia();
                cmd = new OleDbCommand("SELECT * FROM DocGia WHERE MaSoSV='" + maSinhVien + "'", dataConnection);
                OleDbDataReader dataReader = cmd.ExecuteReader();
                if (dataReader == null)
                {
                    throw new Exception("Không có dữ liệu đọc giả - CDocGiaDAL");
                }
                else
                {
                    while (dataReader.Read())
                    {

                        dg.DocGiaID = dataReader.GetValue(0).ToString();
                        dg.TenDocGia = dataReader.GetValue(1).ToString();
                        dg.MaSoSV = maSinhVien;
                        dg.NgaySinh = Convert.ToDateTime(dataReader.GetValue(3));
                        dg.GioiTinh = Convert.ToBoolean(dataReader.GetValue(4));
                        dg.SoDT = dataReader.GetValue(5).ToString();
                        dg.NgayLapThe = Convert.ToDateTime(dataReader.GetValue(6));
                        dg.TinhTrang = dataReader.GetValue(7).ToString();
                        dg.KyQuy = Convert.ToDouble(dataReader.GetValue(8));
                        dg.NienKhoa = dataReader.GetValue(9).ToString();
                        dg.Lop = dataReader.GetValue(10).ToString();
                        dg.Khoa = dataReader.GetValue(11).ToString();
                        dg.DsPhieuMuon = LoadPhieuMuon(dataReader.GetValue(0).ToString());
                        arrDG.Add(dg);
                    }
                    return arrDG;
                }
            }
            catch (System.Exception ex)
            {
                throw new Exception("LỖi Load DocGia - CDocGiaDAL");
            }
        }

        public ArrayList loadOnlySoDTSV(string soDT)
        {
            KTConnect();
            try
            {
                ArrayList arrDG = new ArrayList();
                CDocGia dg = new CDocGia();
                cmd = new OleDbCommand("SELECT * FROM DocGia WHERE SoDT='" + soDT + "'", dataConnection);
                OleDbDataReader dataReader = cmd.ExecuteReader();
                if (dataReader == null)
                {
                    throw new Exception("Không có dữ liệu đọc giả - CDocGiaDAL");
                }
                else
                {
                    while (dataReader.Read())
                    {

                        dg.DocGiaID = dataReader.GetValue(0).ToString();
                        dg.TenDocGia = dataReader.GetValue(1).ToString();
                        dg.MaSoSV = dataReader.GetValue(2).ToString();
                        dg.NgaySinh = Convert.ToDateTime(dataReader.GetValue(3));
                        dg.GioiTinh = Convert.ToBoolean(dataReader.GetValue(4));
                        dg.SoDT = soDT;
                        dg.NgayLapThe = Convert.ToDateTime(dataReader.GetValue(6));
                        dg.TinhTrang = dataReader.GetValue(7).ToString();
                        dg.KyQuy = Convert.ToDouble(dataReader.GetValue(8));
                        dg.NienKhoa = dataReader.GetValue(9).ToString();
                        dg.Lop = dataReader.GetValue(10).ToString();
                        dg.Khoa = dataReader.GetValue(11).ToString();
                        dg.DsPhieuMuon = LoadPhieuMuon(dataReader.GetValue(0).ToString());
                        arrDG.Add(dg);
                    }
                    return arrDG;
                }
            }
            catch (System.Exception ex)
            {
                throw new Exception("LỖi Load DocGia - CDocGiaDAL");
            }
        }

        #region: Execute SQL Query
        //Hàm INSERT Đọc Giả vào CSDL
        public bool themDocGia(CDocGia dg)
        {
            KTConnect();
            try
            {
                //Kiểm tra có tồn tại MSSV trong Bang DocGia
                cmd = new OleDbCommand("SELECT MaSoSV FROM DocGia WHERE MaSoSV='" + dg.MaSoSV + "'", dataConnection);
                string masosv = (string)cmd.ExecuteScalar();
                if (masosv == null)
                {
                    cmd = new OleDbCommand("INSERT INTO DocGia VALUES('"
                        + dg.DocGiaID + "', '"
                        + dg.TenDocGia
                        + "', '" + dg.MaSoSV
                        + "', #" + dg.NgaySinh
                        + "#, " + dg.GioiTinh
                        + ", '" + dg.SoDT
                        + "', #" + dg.NgayLapThe
                        + "#, '" + dg.TinhTrang
                        + "', " + dg.KyQuy
                        + ", '" + dg.NienKhoa
                        + "', '" + dg.Lop
                        + "', '" + dg.Khoa + "')", dataConnection);
                    cmd.ExecuteNonQuery();
                    return true;
                }
                else
                {
                    throw new Exception("Đọc giả đã tồn tại");
                }
            }
            catch (System.Exception ex)
            {
                throw new Exception("Đọc Giả Đã Tồn Tại - CDocGiaDAL");
            }
        }

        //Hàm UPDATE Đọc Giả có trong CSDL
        public bool suaDocGia(CDocGia dg)
        {
            KTConnect();
            try
            {
                //GioiTinh & KyQuy ko có nháy kép. Có sai thì sửa chỗ đó!
                cmd = new OleDbCommand("UPDATE DocGia SET "
                    + " TenDocGia='" + dg.TenDocGia + "'"
                    + ", MaSoSV='" + dg.MaSoSV + "'"
                    + ", NgaySinh=#" + dg.NgaySinh + "#"
                    + ", GioiTinh=" + dg.GioiTinh + ""
                    + ",SoDT='" + dg.SoDT + "'"
                + ", NgayLapThe=#" + dg.NgayLapThe + "#"
                + ", TinhTrang='" + dg.TinhTrang + "'"
                + ", KyQuy=" + dg.KyQuy + ""
                + ", NienKhoa='" + dg.NienKhoa + "'"
                + ", Lop='" + dg.Lop + "'"
                + ", Khoa='" + dg.Khoa + "'"
                + " WHERE DocGiaID='" + dg.DocGiaID + "'", dataConnection);
                cmd.ExecuteNonQuery();
                return true;
            }
            catch (System.Exception ex)
            {
                throw new Exception("Lỗi cập nhật đọc giả - CDocGiaDAL");
            }
        }

        //Hàm xóa một đọc giả trong CSDL
        public bool xoaDocGia(CDocGia dg)
        {
            KTConnect();
            try
            {
                cmd = new OleDbCommand("DELETE FROM DocGia WHERE DocGiaID='" + dg.DocGiaID + "'",dataConnection);
                cmd.ExecuteNonQuery();
                return true;
            }
            catch (System.Exception ex)
            {
                throw new Exception("Lỗi xóa đọc giả - CDocGiaDAL");
            }
        }
        //--Way 2:
        public bool xoaDocGia(string maDocGia)
        {
            KTConnect();
            try
            {
                cmd = new OleDbCommand("DELETE FROM DocGia WHERE DocGiaID='" + maDocGia + "'",dataConnection);
                cmd.ExecuteNonQuery();
                return true;
            }
            catch (System.Exception ex)
            {
                throw new Exception("Lỗi xóa đọc giả - CDocGiaDAL");
            }
        }
        #endregion
        

        #region: Tìm Kiếm. Các hàm tìm kiếm viết vào đây
        //Tìm theo mã đọc giả
        public CDocGia timMaDocGia(string maDocGia)
        {
            KTConnect();
            try
            {
                CDocGia dg = new CDocGia();
                cmd = new OleDbCommand("SELECT * FROM DocGia WHERE DocGiaID='" + maDocGia + "'",dataConnection);
                OleDbDataReader dataReader = cmd.ExecuteReader();
                if (dataReader == null)
                {
                    throw new Exception("Không có dữ liệu đọc giả - CDocGiaDAL");
                }
                else
                {
                    while (dataReader.Read())
                    {
                        dg.DocGiaID = dataReader.GetValue(0).ToString();
                        dg.TenDocGia = dataReader.GetValue(1).ToString();
                        dg.MaSoSV = dataReader.GetValue(2).ToString();
                        dg.NgaySinh = Convert.ToDateTime(dataReader.GetValue(3));
                        dg.GioiTinh = Convert.ToBoolean(dataReader.GetValue(4));
                        dg.SoDT = dataReader.GetValue(5).ToString();
                        dg.NgayLapThe = Convert.ToDateTime(dataReader.GetValue(6));
                        dg.TinhTrang = dataReader.GetValue(7).ToString();
                        dg.KyQuy = Convert.ToDouble(dataReader.GetValue(8));
                        dg.NienKhoa = dataReader.GetValue(9).ToString();
                        dg.Lop = dataReader.GetValue(10).ToString();
                        dg.Khoa = dataReader.GetValue(11).ToString();
                        dg.DsPhieuMuon = LoadPhieuMuon(dataReader.GetValue(0).ToString());
                    }
                    return dg;
                }
            }
            catch (System.Exception ex)
            {
                throw new Exception("Tìm Không Thấy Mã Đọc Giả - CDocGiaDAL");
            }
        }

        //Tìm theo mã sinh viên
        public CDocGia timMaSinhVien(string maSinhVien)
        {
            KTConnect();
            try
            {
                CDocGia dg = new CDocGia();
                cmd = new OleDbCommand("SELECT * FROM DocGia WHERE MaSoSV='" + maSinhVien + "'", dataConnection);
                OleDbDataReader dataReader = cmd.ExecuteReader();
                if (dataReader == null)
                {
                    throw new Exception("Không có dữ liệu đọc giả - CDocGiaDAL");
                }
                else
                {
                    while (dataReader.Read())
                    {
                        dg.DocGiaID = dataReader.GetValue(0).ToString();
                        dg.TenDocGia = dataReader.GetValue(1).ToString();
                        dg.MaSoSV = dataReader.GetValue(2).ToString();
                        dg.NgaySinh = Convert.ToDateTime(dataReader.GetValue(3));
                        dg.GioiTinh = Convert.ToBoolean(dataReader.GetValue(4));
                        dg.SoDT = dataReader.GetValue(5).ToString();
                        dg.NgayLapThe = Convert.ToDateTime(dataReader.GetValue(6));
                        dg.TinhTrang = dataReader.GetValue(7).ToString();
                        dg.KyQuy = Convert.ToDouble(dataReader.GetValue(8));
                        dg.NienKhoa = dataReader.GetValue(9).ToString();
                        dg.Lop = dataReader.GetValue(10).ToString();
                        dg.Khoa = dataReader.GetValue(11).ToString();
                        dg.DsPhieuMuon = LoadPhieuMuon(dataReader.GetValue(0).ToString());
                    }
                    return dg;
                }
            }
            catch (System.Exception ex)
            {
                throw new Exception("Tìm Không Thấy Mã Sinh Viên - CDocGiaDAL");
            }
        }


        //Tìm theo số điện thoại
        public CDocGia timSoDTSV(string soDT)
        {
            KTConnect();
            try
            {
                CDocGia dg = new CDocGia();
                cmd = new OleDbCommand("SELECT * FROM DocGia WHERE SoDT='" + soDT + "'", dataConnection);
                OleDbDataReader dataReader = cmd.ExecuteReader();
                if (dataReader == null)
                {
                    throw new Exception("Không có dữ liệu đọc giả - CDocGiaDAL");
                }
                else
                {
                    while (dataReader.Read())
                    {
                        dg.DocGiaID = dataReader.GetValue(0).ToString();
                        dg.TenDocGia = dataReader.GetValue(1).ToString();
                        dg.MaSoSV = dataReader.GetValue(2).ToString();
                        dg.NgaySinh = Convert.ToDateTime(dataReader.GetValue(3));
                        dg.GioiTinh = Convert.ToBoolean(dataReader.GetValue(4));
                        dg.SoDT = dataReader.GetValue(5).ToString();
                        dg.NgayLapThe = Convert.ToDateTime(dataReader.GetValue(6));
                        dg.TinhTrang = dataReader.GetValue(7).ToString();
                        dg.KyQuy = Convert.ToDouble(dataReader.GetValue(8));
                        dg.NienKhoa = dataReader.GetValue(9).ToString();
                        dg.Lop = dataReader.GetValue(10).ToString();
                        dg.Khoa = dataReader.GetValue(11).ToString();
                        dg.DsPhieuMuon = LoadPhieuMuon(dataReader.GetValue(0).ToString());
                    }
                    return dg;
                }
            }
            catch (System.Exception ex)
            {
                throw new Exception("Tìm Không Thấy Mã Sinh Viên - CDocGiaDAL");
            }
        }

        //Tìm nhiều thông tin

        #endregion

        #region: Wolfag
        public bool CheckMaSinhVien(string str)
        {
            cmd = new OleDbCommand("SELECT MaSoSV FROM DocGia WHERE MaSoSV='" + str + "'", dataConnection);
            string kq = (string)cmd.ExecuteScalar();
            if (kq == null)
            {
                return false;
            }
            return true;
        }

        public CDocGia timTenTheoMaDocGia(string maDocGia)
        {
            KTConnect();
            try
            {
                CDocGia dg = new CDocGia();
                cmd = new OleDbCommand("SELECT * FROM DocGia WHERE DocGiaID='" + maDocGia + "'", dataConnection);
                OleDbDataReader dataReader = cmd.ExecuteReader();
                if (dataReader == null)
                {
                    throw new Exception("Không có dữ liệu đọc giả - CDocGiaDAL");
                }
                else
                {
                    while (dataReader.Read())
                    {
                        dg.DocGiaID = dataReader.GetValue(0).ToString();
                        dg.TenDocGia = dataReader.GetValue(1).ToString();
                        dg.MaSoSV = dataReader.GetValue(2).ToString();
                        dg.NgaySinh = Convert.ToDateTime(dataReader.GetValue(3));
                        dg.GioiTinh = Convert.ToBoolean(dataReader.GetValue(4));
                        dg.SoDT = dataReader.GetValue(5).ToString();
                        dg.NgayLapThe = Convert.ToDateTime(dataReader.GetValue(6));
                        dg.TinhTrang = dataReader.GetValue(7).ToString();
                        dg.KyQuy = Convert.ToDouble(dataReader.GetValue(8));
                        dg.NienKhoa = dataReader.GetValue(9).ToString();
                        dg.Lop = dataReader.GetValue(10).ToString();
                        dg.Khoa = dataReader.GetValue(11).ToString();
                        dg.DsPhieuMuon = LoadPhieuMuon(dataReader.GetValue(0).ToString());
                    }
                    return dg;
                }
            }
            catch (System.Exception ex)
            {
                throw new Exception("Tìm Không Thấy Mã Đọc Giả - CDocGiaDAL");
            }
        }

        /*
        private List<CDocGia> GetList(string cmd)
        {
            DataTable dt = db.GetDataTable(cmd);
            List<CDocGia> lst = new List<CDocGia>();
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow r in dt.Rows)
                {
                    CDocGia ds = new CDocGia(r);
                    List<CSach> lstSach = new List<CSach>();
                    lstSach = dalSach.GetListByDauSachID(ds.MaDauSach);
                    ds.DsSach = lstSach;

                    lst.Add(ds);
                }
                return lst;
            }
            return null;
        }

        public List<CDocGia> GetListByListColumnsNames(List<string> columnsNames, List<string> values)
        {
            string dk = "";
            int n = columnsNames.Count();
            for (int i = 0; i < n - 1; i++)
            {
                if (columnsNames[i] == "NamXB")
                {
                    dk += columnsNames[i] + "=" + values[i] + " and ";
                }
                else
                {
                    dk += columnsNames[i] + " LIKE '%" + values[i] + "%' and ";
                }
            }

            if (columnsNames[n - 1] == "NamXB")
            {
                dk += columnsNames[n - 1] + "=" + values[n - 1];
            }
            else
            {
                dk += columnsNames[n - 1] + " LIKE '%" + values[n - 1] + "%'";
            }

            string cmd = "SELECT * FROM DauSach WHERE " + dk;
            return GetList(cmd);
        }
         * */
        #endregion
    }
}
